[英]Problems converting image to bytes and then to string
我有一個基於套接字通信的應用程序,服務器將請求發送到客戶端以獲取簽名圖像。 簽名在客戶端獲取,然后發送回服務器。
為此,我使用了一個圖片框,將其數據轉換為字節,然后轉換為字符串,以通過套接字連接發送到服務器。 一切正常。
我在保存數據庫中接收到的數據時遇到問題,因為我需要將其保存為圖像類型,但是此時數據仍然是字符串,因此出現錯誤:
“操作數類型沖突:nvarchar與圖像不兼容”
我猜想是因為我正在嘗試將字符串發送到sql圖像類型?
嘗試調用該過程和錯誤的代碼(服務器端接收的數據作為字符串):
try
{
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["GetConnector"].ConnectionString))
{
SqlCommand sqlComm = new SqlCommand("PL_Device_ReadData", conn);
sqlComm.Parameters.AddWithValue("@DeviceTypeID", DeviceID);
sqlComm.Parameters.AddWithValue("@RequestID", RequestID);
if (DeviceID != "5")
{
sqlComm.Parameters.AddWithValue("@Reading", Reading);
}
else if (DeviceID == "5")
{
sqlComm.Parameters.AddWithValue("@ImageReading", Reading);
sqlComm.Parameters.Add("@ImageReading", SqlDbType.Image);
sqlComm.Parameters["@ImageReading"].Value = Reading;
}
sqlComm.CommandType = CommandType.StoredProcedure;
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = sqlComm;
da.Fill(ds);
}
}
catch (Exception e)
{
}
存儲過程:
ALTER PROCEDURE [dbo].[PL_Device_ReadData]
@DeviceTypeID INT,
@RequestID INT,
@Reading NVARCHAR(100) = NULL,
@ImageReading IMAGE = NULL
AS
BEGIN
--Data
IF @DeviceTypeID = 5
BEGIN
UPDATE dbo.DeviceRequests
SET ImageData = @ImageReading
WHERE id = @RequestID
AND DeviceTypeID = @DeviceTypeID
END
ELSE
BEGIN
UPDATE dbo.DeviceRequests
SET Value = @Reading
WHERE id = @RequestID
AND DeviceTypeID = @DeviceTypeID
END
END
將圖像轉換為字節:
byte[] imgData = null;
// storage for the img bytes
imgData = ImgToByteArray(picSignature.InitialImage, ImageFormat.Jpeg);
public static byte[] ImgToByteArray(Image img, ImageFormat imgFormat)
{
byte[] tmpData = null;
using (MemoryStream ms = new MemoryStream())
{
img.Save(ms, imgFormat);
tmpData = ms.ToArray();
}
// dispose of memstream
return tmpData;
}
將字節轉換為字符串(以通過套接字發送):
_Reading = System.Text.Encoding.UTF8.GetString(_imagevalues);
為此,我使用了一個圖片框,將其數據轉換為字節,然后轉換為字符串,以通過套接字連接發送到服務器。 一切正常。
給定您顯示的代碼,我建議可能沒有。 尤其是:
_Reading = System.Text.Encoding.UTF8.GetString(_imagevalues);
圖片數據不是 UTF-8編碼的文本,因此您不應使用Encoding.UTF8
或任何其他編碼。 編碼旨在將自然純文本轉換為字節並返回。 相反,您具有任意二進制數據。
理想情況下,您應該將此套接字作為二進制數據通過套接字傳輸-尚不清楚為什么根本不需要字符串。 如果你真的需要一個字符串,但是,你應該字節轉換為文本使用的base64:
string base64 = Convert.ToBase64String(bytes);
然后在另一側,您可以執行相反的操作:
byte[] bytes = Convert.FromBase64String(base64);
但是正如我說的那樣,如果您控制協議,則僅以二進制形式傳輸字節而根本不將其轉換為文本會更清潔,更高效。 我們無法確定這是什么協議,因此很難知道是否可以選擇。
這個:
_Reading = System.Text.Encoding.UTF8.GetString(_imagevalues);
是錯的。 _imagevalues
是否保存圖像的二進制數據? 比起這行代碼,您試圖將其解釋為字符串,這是錯誤的。 您只需要轉換圖像的每個字節即可說出其十六進制字符串表示形式。 然后通過網絡發送整個這樣的字符串。 例如,請參見此處如何將字節數組轉換為十六進制字符串,反之亦然? (如答案之一所述,這種轉換並不是真正必要的,您也可以發送純字節)。
然后在服務器端,您必須解析此十六進制字符串並將其轉換為字節數組,並可能保存在數據庫中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.